package fr.univ.colloque.servlet;

import fr.univ.colloque.dao.ColloqueDao;
import fr.univ.colloque.dao.MotCleDao;
import fr.univ.colloque.data.Colloque;
import fr.univ.colloque.data.MotCle;
import fr.univ.colloque.data.Personne;
import fr.univ.colloque.util.Link;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CreationColloque extends HttpServlet
{
    // Messages d'erreur

    private static String ERR_THEME_ABS = "Le thème est obligatoire";
    private static String ERR_DESCRIPTION_ABS = "La description est obligatoire";
    private static String ERR_DEBUT_ABS = "La date de début des dépots est obligatoire";
    private static String ERR_DEBUT_FORMAT = "Mauvais format pour la date de début. (dd/mm/yyyy)";
    
    private static String ERR_MC_ABS = "Le choix d'au moins un mot clé est obligatoire.";
    private static String ERR_MC_TROIS = "Les mots clé doivent être au nombre de 3 au minimum";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        Link lien = Link.FORM_CREATION_COLLOQUE;

        HttpSession session = req.getSession();

        Personne connecte = (Personne) session.getAttribute("user");

        if (connecte == null || !lien.getType().equals(connecte.getType()))
        {
            // La personne connecté n'a pas les droits nécessaires pour accéder à cette page
            resp.sendRedirect("indexCo.jsp?e=1");
        }
        else
        {
            req.setAttribute("page", lien);

            // Redirection vers le formulaire de création
            req.getRequestDispatcher("indexCo.jsp").forward(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        // Récupération des saises du formulaire
        String theme = req.getParameter("theme");
        String desc = req.getParameter("description");
        String dtDeb = req.getParameter("dtDebut");
        String[] tabMc = req.getParameterValues("mc");

        Date dtDebut = null;

        Colloque co = new Colloque();

        boolean erreur = false;
        List<String> listErr = new ArrayList<String>();

        // Test si RG respectées
        if (theme == null || "".equals(theme.trim()))
        {
            // Theme non saisi
            listErr.add(ERR_THEME_ABS);
            erreur = true;
        }
        else
        {
            co.setTheme(theme);
        }

        if (desc == null || "".equals(desc.trim()))
        {
            // Description non saisi
            listErr.add(ERR_DESCRIPTION_ABS);
            erreur = true;
        }
        else
        {
            co.setDescription(desc);
        }

        if (dtDeb == null || "".equals(dtDeb.trim()))
        {
            // Date de debut non saisi
            listErr.add(ERR_DEBUT_ABS);
            erreur = true;
        }
        else
        {
            SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            try
            {
                dtDebut = df.parse(dtDeb);
                co.setDateOuvertureDepot(dtDebut);
            }
            catch (ParseException pe)
            {
                // Date de début ne respecte pas le bon format de date
                erreur = true;
                listErr.add(ERR_DEBUT_FORMAT);
            }
        }

        MotCleDao mcDao = new MotCleDao();
        if (tabMc != null)
        {
            if (tabMc.length < 3)
            {
                // Mot clé pas en nombre suffisant
                listErr.add(ERR_MC_TROIS);
                erreur = true;
            }
            else
            {
                for (String idStr : tabMc)
                {
                    try
                    {
                        int id = Integer.parseInt(idStr);
                        MotCle mc = mcDao.get(id);

                        if (co.getLstMotCle() == null)
                        {
                            // Si la liste des mots clé n'est pas initialisé, on le fait
                            co.setLstMotCle(new ArrayList<MotCle>());
                        }

                        co.getLstMotCle().add(mc);
                    }
                    catch (NumberFormatException ne)
                    {
                        System.err.println("Immpossible de trouver le mot clé correspondant à l'identifiant " + idStr);
                    }
                }
            }
        }
        else
        {
            // Mot clé non choisi
            listErr.add(ERR_MC_ABS);
            erreur = true;
        }
        if (erreur)
        {
            req.setAttribute("err", listErr);

            // on redirige vers le formulaire de création pour afficher le(s) message(s) d erreur
            Link lien = Link.FORM_CREATION_COLLOQUE;

            // Page qu'il va mettre dans la partie à droite du menu
            req.setAttribute("page", lien);

            // On enregistre dans la request l'objet colloque 
            // pour ne pas perdre les saisies corrects et les reafficher dans le formulaire
            req.setAttribute("co", co);

            // Redirige vers la page gabarit
            req.getRequestDispatcher("indexCo.jsp").forward(req, resp);
        }
        else
        {
            // Enregistrement du nouveau colloque
            ColloqueDao cDao = new ColloqueDao();
            // On enregistre le nouveau colloque et on récupère son identifiant généré
            int idColloque = cDao.save(co);

            // On enregistre les mots clés pour le colloque venant d'être créé
            mcDao.saveMcDuColloque(idColloque, co.getLstMotCle());

            // Redirection vers la page d'accueil de l'application
            resp.sendRedirect("indexCo.jsp");
        }
    }
}
